L17: Plánované spouštění úloh

linux.edumach.cz



1. Východiska

Plánované spouštění úloh je klíčovým prvkem správy systému Linux, který umožňuje automatizovat opakující se úkoly v rámci systému.

2. Příkaz at

V Unixových operačních systémech, slouží příkaz at k naplánování příkazů, které se mají spustit najednou, v konkrétním čase v budoucnosti. Přesněji, čte série příkazů ze standardního vstupu a sbírá je do jednoho at-jobu a spustí je v nastaveném čase. Job dědí stávající prostředky, a tak je spuštěn ve stejÚvod

Cron je Unixový systémový nástroj (démon), který spouští různém pracovním adresáři a se stejnými parametry jako byl naplánován. S jistou mírou nepřesnosti jej lze chápat jako makro.

Obecné příklady použití:

$ at now + 15 min  
at> ./skripty/uloha.sh

Ukončení (a aktivace) zkratkou Ctrl+D

Nebo i takto:

$ echo "./skripty/uloha.sh" | at now + 15 min

V obou případech spustí skript ./skripty/uloha.sh za 15 minut. Soubor musí být pochopitelně spustitelný (x).

2.1. Příkazy atq a atrm

2.2. Příkaz batch

Příkaz batch řadí úlohy do fronty a předává je systému ke zpracování jednu po druhé v případě, že průměr zátěže systému je nižší než 0,8 násobek implicitního.

☝️ Je rozumné volit neobvyklé časy (např. 3:22, 7:17, 14:03) než časy „kulaté“ (např. 3:00, 7:00, 14:00). Ty jsou primárně „předurčené“ pro spouštění systémových úloh.

3. Služba cron

Cron je Unixový systémový nástroj (démon), který spouští různé programy v předem definovanou dobu a intervalu. Každý trošku vyspělejší server se bez nějwebový projekt se bez tohoto démona neobejde.

Démon cron používají převážně administrátoři ke spouštění programů a skriptů, které pomáhají udržovat operační systém nebo automatizovat opakující se činnosti. Například mazání pomocných souborů, synchronizace času, provádění pravidelného zálohování databází, archivaci adresářů nebo přesun souborů mezi servery. Možností je nepočítaně.

3.1. Nastavení cronu

Výpis naplánovaných úloh zjistitíte příkazem uptime nebo jinými nástroji pro monitoring systému. Například výstup příkazu uptime může vypadat takto:

$ uptime
14:35:01 up 3:25, 3 users, load average: 0.08, 0.12, 0.15

Hodnoty za load average udávají průměrnou zátěž za:

Jak batch reaguje na zátěž:

Příkaz batch spustí úlohy pouze v případě, že zátěž systému je nižší než určité procento maximální kapacity (obvykle definováno jako 0.8 násobek počtu jader). Pokud je zátěž vyšší

# crontab -l

Úprava úloh se provádí příkazem

# crontab -e

Otevře soubor s úlohami ve výchozím textovém editoru. Pokud jste jej neměnili, pak nejspíše editoru nano.

Každý řádek definuje jednu úlohu pomocí šesti parametrů. Prvních 5 je čas, poslední je samotný příkaz. Pokud je spuštěných příkazů víc, úulohyogramy v předem definovanou dobu a intervalu. Každý trošku vyspělejší server se bez nějwebový projekt se nbezačnou zpracovávat, dokud zátěž neklesne pod tuto úroveň.

4. Služba cron

Cron je služba (démon), která spouští různé programy v předem definovanou dobu a intervalu tohoto démona neobejde.

Démon cron používají převážně administrátoři ke spouštění programů a skriptů, které pomáhají udržovat operační systém nebo automatizovat opakující se činnosti. Například mazání pomocných souborů, synchronizace času, provádění pravidelného zálohování databází, archivaci adresářů nebo přesun souborů mezi servery. Možností je bezpočet.

Nezaměňujte: "Cron" je systémový démon, který spouští plánované úlohy v určený čas, zatímco "crontab" je nástroj pro editaci, zobrazení a správu seznamu plánovanýchží se do souboru a jen se zde zavolá. Nejkratším intervalem cronu je 1 minuta, nejdelší 1 rok.

4.1. Nastavení cronu

Do speciálního souboru crontab jednoduše stačí zapsat příkaz a čas spouštění.

Příkaz crontab -l vypíše obsah souboru -- přehled plánovaných úloh.

Příkaz crontab -e otevře ve výchozím editoru soubor, ve kterém bude seznam úloh (pokud takové jsou):

m h dom mon dow príkaz
+---------- minuty (0-59)
| +-------- hodiny (0-23)
| | +------ den v mesíci (1-31)
| | | +---- mesic (1-12) nebo jan,feb,mar...dec
| | | | +-- den týdne (0-6) (Ne=0 nebo 7) nebo mon,tue,wed...
| | | | |
* * * * * <príkaz nebo soubor se skriptem>

Prvních 5 je čas, poslední je samotný příkaz. Pokud je spuštěných příkazů víc, uloží se do skriptu a jen se zde spustí.

Pokud je místo některého z prvních pěti parametrů * (hvězdička), znamená to, že parametr není definován. Bílé znaky (mezery, tabulátory) se ignorují.

4.2. Příklady

0 1 * * * prikaz ... každý den v 1:00 ráno
5 1 * * * prikaz ... denně v 1:05 ráno
0 0 1 * * prikaz ... každého 1. v měsíci
*/5 * * * * prikaz ... každých 5 minut (kratší zápis)
* */12 * 1-6,9-12 1-4 prikaz ... Po-Pá každých 12 hodin mimo prázdniny.

Prakticky lze nastavit jakýkoliv interval od 1 minuty do 1 roku.

Spuštěná naplánovaná úloha nemá přidělený terminál a tudíž nemá přidělen proud 1 (stdout) aniani stdout a stderr*). Je téměř povinností případný výstup, hlavně ten chybový nějak zpracovat zahazovat. A -- jak jinak, než přesměrováním do /dev/null:

... prikaz &> /dev/null

Pokud by se takto neošetřila, cron by případný stdout i stderr poslal na e-mail uživatele. Ty si jde přečíst příkazem mail.

Pokud chcete naplánovanou úlohu deaktivovat, není nutné řádek v crontabu mazat. Stačí jej zakomentovat znakem #. Časování této úlohy se vypne.

Existují i předdefinované časy pro snazší zápis:

@hourly
@daily
@monthly
@yearly
@reboot

Například:

@daily   prikaz_1
@monthly prikaz_2

Alternativní možností jak naplánovat úlohu, spočívá v uložení souboru se skriptem do jednoho ze systémových adresářů (jako root). Máme na výběr ze čtyř předdefinovaných časů:

/etc/cron.daily
/etc/cron.hourly
/etc/cron.weekly
/etc/cron.monthly

4.3. Podmíněné spouštění úloh

Princip podmíněného spouštění v crontabu spočívá v použití shellových příkazů, které ověřují určité podmínky před samotným spuštěním úlohy. Podmínka je zapsána pomocí logických testů (např. [ -f /cesta/k/souboru ] pro kontrolu existence souboru) a v případě jejího splnění se provede zadaný příkaz.

Příklad:

[ podmínka ] && příkaz

Příklady:

[ -f ./spustit ] && ./skripty/uloha.sh

Spuštění, pokud soubor existuje

[ -s ./data.dat ] && ./skripty/analyza.sh

Spuštění, pokud soubor není prázdný

To umožňuje spouštět úlohy pouze za určitých podmínek, což zvyšuje úroveň automatizaceOnline generátory
Existuje několik šikovných online generátorů, kde si časovou periodu jednoduše "naklikáte", např.:

4.4. 💾 Cvičení

Sestavte řádek crontabu, který:

  1. spustí příkaz /root/zaloha.sh jedenkrát týdně, vždy v noci.
  2. spustí skript /root/skripty/aaa.sh každý pátek a sobotu ve 3:20 hod ráno.
  3. spustí skript /root/skripty/bbb.sh každý den 2×.
  4. spustí skript /root/skripty/ccc.sh každé pondělí a středu v 15:00 a 20:00 hodin.
  5. spustí příkaz df -h >> /root/velikost jedenkrát měsíčně v 23:59 hodin.